<?php


namespace app\common\model;


use think\Model;
use traits\model\SoftDelete;

class UserScoreLog extends Model
{
    use SoftDelete;

    // 表名
    protected $name = 'user_level_score_log';

    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'datetime';
    protected $dateFormat = 'Y-m-d H:i:s';

    // 定义时间戳字段名
    protected $createTime = 'create_dt';
    protected $updateTime = 'update_dt';
    protected $deleteTime = false;

    // 追加属性
    protected $append = [
        'log_type_text'
    ];


    public function user()
    {
        return $this->belongsTo('User', 'user_id', 'id', [], 'LEFT')->setEagerlyType(0);
    }


    public function getList($userId, $page = 1, $extend = [], $pageSize = 20)
    {
        $start = ($page - 1) * $pageSize;
        $where = ['user_id' => $userId];
        $where = array_merge($where, $extend);
        $list = $this->where($where)->limit($start, $pageSize)->order("id", "desc")->select();
        return $list ?? [];
    }

    public function getLogTypeTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['log_type']) ? $data['log_type'] : '');
        $list = [1 => '注册赠送', 2 => '下单获得', 3 => '邀请获得'];
        return isset($list[$value]) ? $list[$value] : '';
    }

    /**
     * 添加积分变动记录
     * @param $userId int 商家ID
     * @param $logType int 变动类型:1=充值,2=发布商品,3=提现,4=冻结返还,5=下级返佣
     * @param $money     float 变动金额
     * @param $memo   string 变动说明
     * @param $extend     array 其他
     * @return UserMoneyLog
     */
    public static function addLog($userId, $logType, $money, $memo, $extend = [])
    {
        $data = [
            'user_id' => $userId,
            'log_type' => $logType,
            'score' => $score,
            'log_desc' => $memo,
        ];
        $data = array_merge($data, $extend);
        return self::create($data);
    }

    /**
     * 根据积分获取等级
     * @param int $score 积分
     * @return int
     */
    public static function nextlevel($user_id, $user_score, $user_level, $log_type, $score = 0)
    {   
        // 有没有加群，没有加群的话level为0
        if (!UserLuckdrawLog::where(['memo'=>'加福利群','user_id'=>$user_id,'type'=>1])->find()) {
            return ['level'=>0,'score'=>0];
        }
        // vip5直接累加积分
        if ($user_level==5) {
            return ['level'=>5,'score'=>$score];
        }
        // 邀请获得积分数
        $invite_score = config('invite_score');
        // 订单获得积分数
        $order_score = config('order_score');
        $invite_num = self::where(['user_id'=>$user_id,'log_type'=>3,'level'=>$user_level])->count();
        $order_num = self::where(['user_id'=>$user_id,'log_type'=>2,'level'=>$user_level])->count();
        $vip[1] = ['邀请有效成员数量'=>0,'完成订单数量'=>0];
        $vip[2] = Config::getConfigs('growth_conditions2');
        $vip[3] = Config::getConfigs('growth_conditions3');
        $vip[4] = Config::getConfigs('growth_conditions4');
        $vip[5] = Config::getConfigs('growth_conditions5');
        // 根据完成任务的数量判断等级
        if ($log_type==2) {
            // 两项都不达标，等级不变，积分累加
            if ($order_num<$vip[$user_level+1]['完成订单数量']-1 && $invite_num<$vip[$user_level+1]['邀请有效成员数量']) {
                $level = $user_level;
            // 邀请有效成员数量早已达标，完成订单数量本次也达标了，可以升级，之前没有加的积分累积到新等级
            } elseif ($order_num>=$vip[$user_level+1]['完成订单数量']-1 && $invite_num>=$vip[$user_level+1]['邀请有效成员数量']) {
                $level = $user_level+1;
                // 是否有未计入的积分，有则加上
                $sub = $invite_num-$vip[$user_level+1]['邀请有效成员数量'];
                $sub2 = 1+$order_num-$vip[$user_level+1]['完成订单数量'];
                $score = $sub>0?round($sub*$invite_score+$sub2*$order_score+$score):$score;
            // 完成订单数量早已达标，本次又增加了该项次数，邀请有效成员数量还是没达标，则不升级，积分当前不累加
            } elseif ($order_num<$vip[$user_level+1]['完成订单数量']-1 && $invite_num>=$vip[$user_level+1]['邀请有效成员数量']) {
                $level = $user_level;
                // $score = 0;
            // 邀请有效成员数量早已达标，完成订单数量差的有点多，还没达标，则不升级，积分累加
            } elseif ($order_num>=$vip[$user_level+1]['完成订单数量']-1 && $invite_num<$vip[$user_level+1]['邀请有效成员数量']) {
                $level = $user_level;
            }
        }
        if ($log_type==3) {
            // 两项都不达标，等级不变，积分累加
            if ($order_num<$vip[$user_level+1]['完成订单数量'] && $invite_num<$vip[$user_level+1]['邀请有效成员数量']-1) {
                $level = $user_level;
            // 完成订单数量早已达标，邀请有效成员数量本次也达标了，可以升级，之前没有加的积分累积到新等级
            } elseif ($order_num>=$vip[$user_level+1]['完成订单数量'] && $invite_num>=$vip[$user_level+1]['邀请有效成员数量']-1) {
                $level = $user_level+1;
                // 是否有未计入的积分，有则加上
                $sub = 1+$invite_num-$vip[$user_level+1]['邀请有效成员数量'];
                $sub2 = $order_num-$vip[$user_level+1]['完成订单数量'];
                $score = $sub>0?round($sub*$invite_score+$sub2*$order_score+$score):$score;
            // 邀请有效成员数量早已达标，本次又增加了该项次数，完成订单数量还是没达标，则不升级，积分当前不累加
            } elseif ($order_num>=$vip[$user_level+1]['完成订单数量'] && $invite_num<$vip[$user_level+1]['邀请有效成员数量']-1) {
                $level = $user_level;
                // $score = 0;
            // 完成订单数量早已达标，邀请有效成员数量差的有点多，还没达标，则不升级，积分累加
            } elseif ($order_num<$vip[$user_level+1]['完成订单数量'] && $invite_num>=$vip[$user_level+1]['邀请有效成员数量']-1) {
                $level = $user_level;
            }
        }
        return ['level'=>$level,'score'=>$score];
    }


}